SubAssetMaterial.cs 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. #if UNITY_EDITOR
  2. using System.Linq;
  3. using UnityEditor;
  4. using UnityEngine;
  5. using UnityEngine.Rendering;
  6. namespace FlatKit {
  7. public static class SubAssetMaterial {
  8. public static Material GetOrCreate(Object settings, string shaderName) {
  9. // Return if called from OnValidate.
  10. {
  11. var stackTrace = new System.Diagnostics.StackTrace();
  12. var frames = stackTrace.GetFrames();
  13. if (frames != null) {
  14. if (frames.Select(frame => frame.GetMethod())
  15. .Any(method => method != null && method.Name == "OnValidate")) {
  16. return null;
  17. }
  18. }
  19. }
  20. var settingsPath = AssetDatabase.GetAssetPath(settings);
  21. var subAssets = AssetDatabase.LoadAllAssetsAtPath(settingsPath);
  22. const string subAssetName = "Effect Material";
  23. var existingMaterial = subAssets.FirstOrDefault(o => o.name == subAssetName) as Material;
  24. if (existingMaterial != null) return existingMaterial;
  25. var shader = Shader.Find(shaderName);
  26. if (shader == null) return null;
  27. var newMaterial = new Material(shader) { name = subAssetName };
  28. try {
  29. AssetDatabase.AddObjectToAsset(newMaterial, settings);
  30. AssetDatabase.ImportAsset(settingsPath);
  31. }
  32. catch {
  33. // ignored
  34. }
  35. return newMaterial;
  36. }
  37. public static void AlwaysInclude(string shaderName) {
  38. var shader = Shader.Find(shaderName);
  39. if (shader == null) return;
  40. var graphicsSettingsObj =
  41. AssetDatabase.LoadAssetAtPath<GraphicsSettings>("ProjectSettings/GraphicsSettings.asset");
  42. if (graphicsSettingsObj == null) return;
  43. var serializedObject = new SerializedObject(graphicsSettingsObj);
  44. var arrayProp = serializedObject.FindProperty("m_AlwaysIncludedShaders");
  45. bool hasShader = false;
  46. for (int i = 0; i < arrayProp.arraySize; ++i) {
  47. var arrayElem = arrayProp.GetArrayElementAtIndex(i);
  48. if (shader == arrayElem.objectReferenceValue) {
  49. hasShader = true;
  50. break;
  51. }
  52. }
  53. if (!hasShader) {
  54. int arrayIndex = arrayProp.arraySize;
  55. arrayProp.InsertArrayElementAtIndex(arrayIndex);
  56. var arrayElem = arrayProp.GetArrayElementAtIndex(arrayIndex);
  57. arrayElem.objectReferenceValue = shader;
  58. serializedObject.ApplyModifiedProperties();
  59. AssetDatabase.SaveAssets();
  60. }
  61. }
  62. }
  63. }
  64. #endif